# Copyright (c) 2010, Lawrence Livermore National Security, LLC. Produced at the
# Lawrence Livermore National Laboratory. LLNL-CODE-443211. All Rights reserved.
# See file COPYRIGHT for details.
#
# This file is part of the MFEM library. For more information and source code
# availability see http://mfem.googlecode.com.
#
# MFEM is free software; you can redistribute it and/or modify it under the
# terms of the GNU Lesser General Public License (as published by the Free
# Software Foundation) version 2.1 dated February 1999.

Help("""
       Type: 'scons' to build the example codes,
             'scons -c' to clean the build,
             'scons debug=1' to build the debug version,
             'scons openmp=1' to enable OpenMP support,
             'scons parallel=1' to build the parallel version.
       """)

import os

# Export the shell environment variables
env = Environment(ENV=os.environ)

CC_OPTS    = '-O3'
DEBUG_OPTS = '-g -Wall'

# External libraries
HYPRE_DIR  = "../../hypre-2.8.0b/src/hypre"
METIS_DIR  = "../../metis-4.0"

# Debug options
debug = ARGUMENTS.get('debug', 0)
if int(debug):
   env.Append(CCFLAGS = DEBUG_OPTS)
else:
   env.Append(CCFLAGS = CC_OPTS)

env.Append(LIBS = ['mfem'])
env.Append(LIBPATH = ['..'])
env.Append(CPPPATH = ['..'])

# OpenMP options
openmp = ARGUMENTS.get('openmp', 0)
if int(openmp):
   env.Append(CCFLAGS = '-fopenmp')
   env.Append(LINKFLAGS = '-fopenmp')
   print 'Enabled OpenMP'

# Parallel version
parallel = ARGUMENTS.get('parallel', 0)
if int(parallel):
   env.Replace(CXX = 'mpicxx')
   env.Append(LIBS = ['HYPRE'])
   env.Append(CPPPATH = [HYPRE_DIR+"/include"])
   env.Append(LIBPATH = [HYPRE_DIR+"/lib"])
   env.Append(LIBS = ['metis'])
   env.Append(LIBPATH = [METIS_DIR])
   print 'Building parallel version'
else:
   print 'Building serial version'

conf = Configure(env)

# Check for LAPACK
if conf.CheckLib('lapack', 'dsyevr_'):
   env.Append(LIBS = ['blas'])
   print 'Using LAPACK'
else:
   print 'Did not find LAPACK, continuing without it'

env = conf.Finish()

# Example codes
if int(parallel):
   ex1p = env.Program('ex1p',['ex1p.cpp'])
   ex2p = env.Program('ex2p',['ex2p.cpp'])
   ex3p = env.Program('ex3p',['ex3p.cpp'])
   ex4p = env.Program('ex4p',['ex4p.cpp'])
else:
   ex1 = env.Program('ex1',['ex1.cpp'])
   ex2 = env.Program('ex2',['ex2.cpp'])
   ex3 = env.Program('ex3',['ex3.cpp'])
   ex4 = env.Program('ex4',['ex4.cpp'])
